﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Net.Mail;
using System.Text;
using BLL.DataContextClasses;

namespace BLL.BusinessClasses
{
    public class Envio
    {
        // Campos
        private int id;
        private DateTime fechaEnvio;
        private Documento documento;
        private Empresa remitente;           //si el remitente no es una empresa, se deduce que el envio proviene del sistema
        private List<Contacto> destinatarios;

        // Propiedades
        public int ID
        {
            get { return this.id; }
            set { this.id = value; }
        }
        public DateTime FechaEnvio
        {
            get { return this.fechaEnvio; }
            set { this.fechaEnvio = value; }
        }
        public Documento DocumentoAEnviar
        {
            get { return this.documento; }
            /*
            get
            {
                if (this.documento == null)
                {
                    this.documento = Documento.GetDocumentoByEnvioID();
                }
                return this.documento;
            }
            */
            set { this.documento = value; }
        }
        public Empresa Remitente
        {
            get { return this.remitente; }
            /*
            get
            {
                if (this.remitente == null)
                {
                    this.remitente = Empresa.GetEmpresaByEnvioID;
                }
                return this.remitente;
            }
            */
            set { this.remitente = value; }
        }
        public List<Contacto> Destinatarios
        {
            get
            {
                if (this.destinatarios == null)
                {
                    this.destinatarios = Contacto.GetDestinatariosByEnvioID(this.ID);
                }
                return this.destinatarios;
            }
            set { this.destinatarios = value; }
        }

        //Constructor

        public Envio(int IDToSearch)
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            try
            {

                DataContextClasses.Envio Env = (from en in DB.Envios
                                                where en.ID == IDToSearch
                                                select en).First();
                this.id = Env.ID;
                this.FechaEnvio = Env.FechaEnvio;

            }

            catch (InvalidOperationException InvOperEx)
            {
#warning Recuerda cambiar este WriteLine por una exception
                //throw new SystemExceptions.InvalidUserException("No existe tal usuario o su username o password estan mal escritos\n" + InvOperEx.Message);
                Console.WriteLine("No existe tal envio \n" + InvOperEx.Message);
            }
        }

        //Constructor especifcamente creado para la funcion Vacantes.EncotrarSolicitantes().
        //Necesita Modificacion
        public Envio(Empresa Emp, int TipoDoc)
        {
            this.remitente = new Empresa(Emp.ID);
            this.fechaEnvio = DateTime.Now;
            this.documento = new Documento(TipoDoc);
            //this.Destinatarios = null;
        }

        //Metodos

        public void Insertar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();
            try
            {
                DataContextClasses.Envio EnvioToInsert = new DataContextClasses.Envio();

                EnvioToInsert.FechaEnvio = this.FechaEnvio;
                EnvioToInsert.ID_Empresa = this.Remitente.ID;
                EnvioToInsert.ID_TipoDocumento = this.DocumentoAEnviar.ID;

                DB.Envios.InsertOnSubmit(EnvioToInsert);

                DB.SubmitChanges();
                this.id = EnvioToInsert.ID;
            }
            catch (Exception ex)
            {
#warning Recuerda cambiar este WriteLine por una exception
                Console.WriteLine("Hubo un problema con la Base de datos\n" + ex.Message);
                //throw new SystemExceptions.InvalidUserException("No existe tal usuario o su username o password estan mal escritos\n" + InvOperEx.Message);
            }
        }

        public void InsertarRelaciones()
        {
            bool YaEstaRelacionada;

            DataClassesDataContext DB = new DataClassesDataContext();

            var ContactosRelacionados = (from c in DB.Envios_Contactos
                                         where c.ID_Envio == this.id
                                         select c);

            List<Contacto> ContactosARelacionar = new List<Contacto>();

            foreach (Contacto Contacto in this.Destinatarios)
            {
                YaEstaRelacionada = false;
                foreach (var item in ContactosRelacionados)
                {
                    if (Contacto.ID == item.ID_Contacto) YaEstaRelacionada = true;
                }
                if (YaEstaRelacionada == false) ContactosARelacionar.Add(Contacto);
            }


            try
            {
                foreach (var item in ContactosARelacionar)
                {
                    DataContextClasses.Envios_Contacto RelacionEnvio_Contacto = new DataContextClasses.Envios_Contacto();

                    RelacionEnvio_Contacto.ID_Envio = this.ID;
                    RelacionEnvio_Contacto.ID_Contacto = item.ID;

                    DB.Envios_Contactos.InsertOnSubmit(RelacionEnvio_Contacto);

                    DB.SubmitChanges();
                }
            }
            catch (Exception ex)
            {
#warning Recuerda cambiar este WriteLine por una exception
                Console.WriteLine("Hubo un problema con la Base de datos\n" + ex.Message);
                //throw new SystemExceptions.InvalidUserException("No existe tal usuario o su username o password estan mal escritos\n" + InvOperEx.Message);
            }
        }

        public static List<Envio> GetEnviosByEmpresaID(int EmpresaID)
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            var EnviosEmpresa = (from e in DB.Envios
                                   where e.ID_Empresa == EmpresaID
                                   select e);

            List<Envio> EnviosDeEmpresa = new List<Envio>();

            foreach (var item in EnviosEmpresa)
            {
                Envio EnvioAIntroducir = new Envio(item.ID);
                EnviosDeEmpresa.Add(EnvioAIntroducir);
            }
            return EnviosDeEmpresa;
        }

        public void EnviarMailSolicitud(Contacto EgresadoMail)
        {
            this.Destinatarios = new List<Contacto>();
            this.Destinatarios.Add(EgresadoMail);

            string from = "intec.prueba@gmail.com";
            string to = EgresadoMail.Descripcion;

            MailMessage mail = new MailMessage();
            mail.To.Add(to);
            mail.From = new MailAddress(from, this.remitente.Nombre, System.Text.Encoding.UTF8);
            mail.Subject = this.DocumentoAEnviar.Nombre;
            mail.SubjectEncoding = System.Text.Encoding.UTF8;
            mail.Body = this.DocumentoAEnviar.Contenido;
            mail.BodyEncoding = System.Text.Encoding.UTF8;
            mail.IsBodyHtml = true;
            mail.Priority = MailPriority.High;

            SmtpClient client = new SmtpClient("http://10.10.4.1", 3128);


            client.Credentials = new System.Net.NetworkCredential(from, "intec.intec");

            client.Port = 587;
            client.Host = "smtp.gmail.com";
            client.EnableSsl = true;

            try
            {
                client.Send(mail);
            }
            catch (Exception)
            {
                SmtpClient client2 = new SmtpClient(/*"http://10.10.4.1", 3128*/);


                client2.Credentials = new System.Net.NetworkCredential(from, "intec.intec");

                client2.Port = 587;
                client2.Host = "smtp.gmail.com";
                client2.EnableSsl = true;

                try
                {
                    client.Send(mail);
                }
                catch (Exception Es)
                {
                    throw new Exception(Es.Message);
                }
            }
        }
    }
}
